const {Observable, Subject} = require('rxjs');
const {map, share} = require('rxjs/operators');

// {
//     const o = new Observable((subscriber) => {
//         subscriber.next(1);
//         subscriber.next(2);
//         subscriber.next(3);
//         subscriber.complete();
//     });
//
//     o.subscribe((res) => {
//         console.log(res);
//     });
//
//     o.pipe(
//         map(res => res * 2)
//     ).subscribe(res => {
//         console.log(res)
//     });
// }

/* 观察者模式 */
// {
//     class Producer {
//         constructor() {
//             this.observers = [];
//         }
//         addListener(o) {
//             this.observers.push(o);
//         }
//         removeListener(o) {
//             this.observers.splice(this.observers.indexOf(o), 1);
//         }
//         announce(msg) {
//             this.observers.forEach((o) => {
//                 o.update(msg);
//             })
//         }
//     }
//
//     class Observer {
//         constructor(name) {
//             this.name = name;
//         }
//         update(message) {
//             console.log(message + ' ' + this.name);
//         }
//     }
//
//     const subject = new Producer();
//     subject.addListener(new Observer('foo'));
//     subject.addListener(new Observer('bar'));
//
//     subject.announce('announce message');
// }

/* ES */
// {
//     const arr = [1, 2, 3];
//     const iterator = arr[Symbol.iterator]();
//     let res;
//     res = iterator.next();
//     console.log(res);
//     res = iterator.next();
//     console.log(res);
//     res = iterator.next();
//     console.log(res);
//     res = iterator.next();
//     console.log(res);
// }

// {
//     function makeIterator(arr) {
//         let nextIndex = 0;
//         return {
//             next: function () {
//                 return nextIndex < arr.length ?
//                     {value: arr[nextIndex++], done: false} :
//                     {value: undefined, done: true}
//             }
//         }
//     }
//
//     const it = makeIterator([1, 2, 3]);
//     let res;
//     res = it.next();
//     console.log(res);
//     res = it.next();
//     console.log(res);
//     res = it.next();
//     console.log(res);
//     res = it.next();
//     console.log(res);
// }

// {
//     const source$ = new Subject();
//
//     source$.subscribe(data => console.log('第一次订阅：', data));
//     source$.next(1);
//     source$.next(2);
//
//     source$.subscribe(data => console.log('第二次订阅：', data));
//     source$.next(3);
//     source$.next(4);
//
//     source$.subscribe(data => console.log('第三次订阅：', data));
//     source$.complete();
// }

{
    const source$ = new Observable((subscribe) => {
        console.log('subscribe start');
        setTimeout(() => subscribe.next(1), 1000);
        setTimeout(() => subscribe.next(2), 2000);
        setTimeout(() => subscribe.next(3), 3000);
        setTimeout(() => {
            subscribe.next(4);
            subscribe.complete();
            console.log('subscribe complete')
        }, 4000);
    });
    const hotSource$ = source$.pipe(share());

    setTimeout(() => {
        hotSource$.subscribe(data => console.log(`第一次订阅： ${data}`));

        setTimeout(() => {
            hotSource$.subscribe(data => console.log(`第二次订阅：${data}`));
        }, 1000);
    }, 800)
}
